package com.nicolas.pattern.composite;

/**
 * 对于树形结构，当容器对象（如文件夹）的某一个方法被调用时，将遍历整个树形结构，
 * 寻找也包含这个方法的成员对象（可以是容器对象，也可以是叶子对象）并调用执行，
 * 牵一而动百，其中使用了递归调用的机制来对整个结构进行处理。
 * 由于容器对象和叶子对象在功能上的区别，在使用这些对象的代码中必须有区别
 * 地对待容器对象和叶子对象，而实际上大多数情况下我们希望一致地处理它们，
 * 因为对于这些对象的区别对待将会使得程序非常复杂。
 * 组合模式为解决此类问题而诞生，它可以让叶子对象和容器对象的使用具有一致性。
 * 
组合模式(Composite Pattern)：组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。
组合模式对单个对象（即叶子对象）和组合对象（即容器对象）的使用具有一致性，
组合模式又可以称为“整体—部分”(Part-Whole)模式，它是一种对象结构型模式。
 * 
 * 组合模式的关键是定义了一个抽象构件类，它既可以代表叶子，又可以代表容器，
 * 而客户端针对该抽象构件类进行编程，无须知道它到底表示的是叶子还是容器，可以对其进行统一处理。
 * 
 * 在组合模式结构中，由于容器构件中仍然可以包含容器构件，
 * 因此在对容器构件进行处理时需要使用递归算法，
 * 即在容器构件的operation()方法中递归调用其成员构件的operation()方法。
 * @author nicolas  2017年2月12日 -- 上午9:49:00
 */
public class CompositeMain {

	public static void main(String[] args) {
		//针对抽象构件编程  
        AbstractFile file1,file2,file3,file4,file5;
        Folder folder1,folder2,folder3,folder4;  
          
        folder1 = new Folder("Sunny的资料");  
        folder2 = new Folder("图像文件");  
        folder3 = new Folder("文本文件");  
        folder4 = new Folder("视频文件");  
          
        file1 = new ImageFile("小龙女.jpg");  
        file2 = new ImageFile("张无忌.gif");  
        file3 = new TextFile("九阴真经.txt");  
        file4 = new TextFile("葵花宝典.doc");  
        file5 = new VideoFile("笑傲江湖.rmvb");  
  
        folder2.add(file1);  
        folder2.add(file2);  
        folder3.add(file3);  
        folder3.add(file4);  
        folder4.add(file5);  
        folder1.add(folder2);  
        folder1.add(folder3);  
        folder1.add(folder4);  
          
        //从“Sunny的资料”节点开始进行杀毒操作  
        folder1.killVirus();  
	}

}
